package com.vast.admin.api.entity;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Data
public class SendContract {

    /**
     * https://openapi.bestsign.info/#/dev/doc/03021303?defineType=docs
     */

    /**
     * 合同编号
     */
    private String contractId;

    /**
     * 签署者账号 指定给哪个用户看
     */
    private String signer;

    /**
     * 有效时间
     * 签署链接的到期时间，unix时间戳格式（秒数）。
     * 超过此时间则无法打开链接页面，需要获取新的签署合同链接。
     * 格式为秒级的unix时间戳，如希望“2017/12/30 10:21:52”到期，则设置为“1514600512”。
     * 注：并不是合同的可签署到期时间，只是此签署链接的有效期。
     * 由于返回的是短链接，如果没有设置则默认是30分钟，如果设置了以设置的为准，但有效期最大不能超过7天。
     */
    private String expireTime;

    /**
     * 图片清晰度
     * 预览图片清晰度，枚举值：96-低清（默认），120-普清，160-高清，240-超清
     */
    private String dpi = "160";

    /**
     * 是否允许拖动签名位置
     * 在有指定signaturePOSTion参数的情况下，是否允许拖动签名位置。取值1/0。（0：不允许，1：允许，下面都是这样的）
     */
    private String isAllowChangeSignaturePosition = "1";

    /**
     * 请求业务流水号
     * 开发者自定义的签署流水号（比如第几次签署之类），如有填写，则在异步推送签署结果时包含此签署流水号
     */
    private String sid;

    /**
     * 是否手绘签名
     * 手动签署时是否手绘签名。取值0/1/2。
     * 0点击签名图片不会触发手写面板（禁止手写）。
     * 1点击签名图片能触发手写面板（既可手写也可使用默认签名）。
     * 2强制必须手绘签名（只能手写不允许使用默认签名），初始不显示用户签名图片，只显示实时手写的签名。
     */
    private String isDrawSignatureImage = "0";

    /**
     * 验证码手机号
     * 手动签署时指定接收手机验证码的手机号，如果需要采用手动签署页面校验短信验证码，则此项必填。
     * 如果手动签不需要短信校验，则此项可不填。 自动签可不填此项。
     */
    private String vcodeMobile;

    /**
     * 回调地址
     * 手动签署时，当用户签署完成后，签署页面指定回跳的页面地址，如果没填此参数则签署完成后跳转到合同预览页面。
     * 如果returnurl带有“http”或“https”开头则判定h5跳转，如果returnurl不带“http”或“https”开头则判定为微信小程序跳转。
     */
    private String returnUrl;

    /**
     * 签名位置坐标列表
     * 签名位置坐标列表
     */
    private List<SignaturePosition> signaturePositions = new ArrayList<>();

    /**
     * 当前位置的签名需要复制到的目标页码列表。
     * 该参数用于控制是否将当前位置的签名复制到其他页。
     * 参数启用之后，当前页的签名会同时出现在其他页的相同位置。
     * 参数值格式如下：
     *      多个页码使用英文逗号(,)分隔。
     *      参数不存在或者参数值为空表示不复制， 参数值为0表示复制到所有页， 参数值为其他表示复制到指定页。
     *      参数值示例："0" "1,2,3,4,5,6" "1,3,5,7,9"
     */
//    private String rptPageNums;

    /**
     * 版本号用于区分手动签的版本，默认为2,枚举值： 2-v2版本, 3-v3版本
     */
    private String version = "3";

    /**
     * 签署完成推送地址
     * 此处有配置则签署推送消息优先使用此配置，如果此处没有配置，则取开发者统一配置的异步推送地址
     */
    private String pushUrl;

    /**
     * 是否要求必须全部阅读
     * 枚举值0/1，默认为0 0-无需拖动到页面底部即可确认签署 1-必须拖动到页面底部，表示阅读完毕才能确认签署
     */
    private String readAll = "1";

    /**
     * app调用SDK刷脸的消息通知
     * app 调用SDK进行刷脸时用到的参数，参数内容为JSBridge，即手动签页面将此参数传递给客户app以便客户app调用对应的刷脸SDK，此时页面将离开手动签页面，后续开发者在SDK刷脸成功后需自行调用自动签接口完成签署，使用此方法本质是自动签。 一般情况，如果不需要用户跳出手动签页面执行其他app操作的话，则REQUEST BODY不需要带有此参数。 新版手动签在返回签署人配置的时候，会将此参数返回给前端，前端需要将此参数传递给app。
     */
//    private String app;

    /**
     * 签名图片宽度
     * 本次签署使用的签名/印章图片在合同PDF上显示的宽度，72dpi下的磅值。
     * 如果指定位置上没有设置签名图片的宽度和高度，那么按照如下默认值处理：
     *      个人签名：默认高度：48磅，最大宽度：130磅，宽度一般小于等于130磅。
     *      企业印章：默认宽度：130磅，默认高度：130磅。
     * 注意：
     *      signatureImageWidth和signatureImageHeight必须同时为空，或者同时存在。
     *      同时为空则使用系统默认的高度和宽度（宽度和高度最大130磅，小于130磅的使用原始尺寸，大于130磅的按比例缩放）。
     *      如果同时有值，则图片按照两个宽高值拉伸/压缩填充，效果可能会产生变形。
     */
    private String signatureImageWidth;

    /**
     * 签名图片高度
     */
    private String signatureImageHeight;

    /**
     * 是否显示手写时间
     * 枚举值0/1，默认为0 1-手写面板及签名图片上显示手写签名操作的时间 0-不显示该时间
     */
    private String isShowHandwrittenTime = "0";

    /**
     * 是否使用刷脸签（支持微信小程序、支付宝小程序内的刷脸签署校验）
     * 是否使用刷脸签。 1-刷脸签，使用刷脸校验； 0或其他-非刷脸签，使用短信校验或无校验；
     */
    private String isFaceAuth = "1";

    /**
     * 签署校验类型
     * 签署校验类型，表示此次签署使用什么方式进行校验，数组形式。
     * 目前的校验方式有：
     *      sms：短信验证码验证；
     *      face：刷脸验证；OTP:动态令牌验证（动态口令）。
     * 校验类型可指定唯一一个校验方式，如：
     *      verifyType = [     "sms" ] 表示仅使用短信验证码验证，同理也可单独指定刷脸校验、或单独指定动态口令校验。
     * 校验类型包含多个校验方式时，由用户在手动签页面自己选择验证方式，如：
     *      verifyType = [    "sms",    "face",    "OTP" ] 表示用户可选择短信验证码验证或者刷脸验证、或者动态口令牌校验。
     * verifyType校验逻辑：
     *      a. verifyType为空：优先使用isFaceAuth设置，如isFaceAuth未设置则校验vcodeMail和vcodeMobile（即标准流程）；
     *      b. verifyType不为空：
     *      b1. 包含"sms"：校验vcodeMail和vcodeMobile，如果未填写，则接口返回错误码：240006
     *      b2. 包含"face"：无视isFaceAuth是否有值，或者值是多少，均可以刷脸签 B3. 包含"OTP"：才可选动态口令牌校验。
     */
    private String[] verifyType = new String[] {"face"};

    /**
     * 是否实名认证与签署合并校验
     * 1表示合并校验，0表示不合并校验。
     * 当合并校验时，可以无需事先调用申请证书接口，接口调用顺序为“注册用户—设置证件信息—创建合同—手动签设置需合并校验”，
     * 此时会根据设置的证件信息与手动签参数来进行手机号三要素的校验或者刷脸校验，校验通过后则自动申请证书并完成签署。
     * 不同的认证方式按对应的认证方式计费。
     */
    private String isVerifyAndSignCombine = "0";

    /**
     * 优先刷脸，备用验证码校验
     * 1表示必须优先刷脸，备用验证码校验，0表示不生效；
     * ①有此参数则意味着必须要刷脸，因此必须要有isFaceAuth否则会报错；
     * ②此参数优先级低于verifyType参数，如果传了verifyType则以verifyType为准；
     * ③参数faceFirst与参数 isVerifyAndSignCombine为互斥，只能二选一使用，不能同时设置，如果同时设置会报错。
     * 设置此参数后，使用手机扫码刷脸后，手机仅体现刷脸结果并提示返回PC页面操作，同时系统自动将刷脸结果回送给PC页面，
     * 并且在PC页面呈现刷脸结果，引导用户在PC上做下一步操作，以便PC环境的returnUrl能正常跳转。
     */
    private String faceFirst = "1";

    /**
     * 签署校验邮箱
     * 手动签署时指定接收签署验证码的邮箱，可以与vcodeMobile搭配同时填写，填写此项则签署页面可实现“邮箱验证码”与“短信验证码”的切换。
     */
//    private String vcodeMail;


    /**
     * 多文档合同时使用
     */
    private Map<String, SignaturePositions> contractParams;

    /**
     * 签署者账号 多文档使用
     */
    private String signerAccount;

    /**
     * 合同目录名称 多文档使用
     */
    private String catalogName;

    @Data
    public class SignaturePosition {

        /**
         * 签名位置页码 页码，从1开始，不能超过合同最大页数
         */
        private String pageNum;

        /**
         * 横坐标，按页面尺寸的百分比计算，取值0.0 - 1.0。以左上角为原点
         */
        private String x;

        /**
         * 纵坐标，同上
         */
        private String y;
    }

    @Data
    public class SignaturePositions {
        List<SignaturePosition> signaturePositions = new ArrayList<>();
    }
}
